#include <iostream>
// 1.包含头文件
#include <fstream>

using std::cout, std::endl, std::string;

// 文本文件
// ios::in  :  为读文件而打开文件
// ios::out  :  为写文件而打开文件,默认情况下，如果文件已存在，会清空其原有内容。
// ios::ate  :  初始位置，文件尾
// ios::app :  追加方式写文件
// ios::trunc  :  如果文件存在，先删除再创建
// ios::binary  :  二进制方式


void write_file(){  //写文件
    // 2.创建流对象
    std::ofstream ofs;
    // 3.指定打开方式
    ofs.open("test.txt", std::ios::out);
    // 4.写内容
    ofs<< "hello world" << endl;
    ofs<< "zha" << endl;
    // 5.关闭文件
    ofs.close();
}

class person{
public:
    char name[64];
    
};
void write_file_binary(){   //二进制写文件
    std::ofstream ofs("person.txt", std::ios::out | std::ios::binary);
    // ofs.open("binary.text", std::ios::out | std::ios::binary);
    person p = {"万"};
    ofs.write((const char *) &p , sizeof(person));
    ofs.close();
}


void read_file(){  //读文件
    // 2.创建流对象
    std::ifstream ifs;

    // 3.指定打开方式
    ifs.open("test.txt", std::ios::in);
    if(!ifs.is_open()){
        cout<< "文件打开失败"<<endl;
    }

    // 4.读数据

    // 第一种
    // char buf[1024] = { 0 };
    // while (ifs >> buf){
    //     cout<< buf <<endl;
    // }

    // 第二种
    // char buf[1024] = { 0 };
    // while ( ifs.getline( buf, sizeof(buf) ) ){
    //     cout<< buf <<endl;
    // }

    // 第三种
    // string s;
    // while(getline(ifs, s)){
    //     cout<< s <<endl;
    // } 

    // 第四种(不推荐)
    char c;
    while( (c = ifs.get()) != EOF ){
        cout << c;
    }

    // 5.关闭文件
    ifs.close();
}

void read_file_binary(){
    std::ifstream ifs("person.txt", std::ios::in | std::ios::binary); 
    if( !ifs.is_open() ){
        cout<< "文件打开失败"<<endl;
        return;
    }
    person p;
    ifs.read((char *) &p , sizeof(p));
    cout<<p.name<<endl;
}


int main()
{
    // write_file();
    // read_file();

    write_file_binary();
    read_file_binary();
    return 0;
}